/*
 ============================================================================
 Name        : LibreriaConsola.c
 Author      : SOogle
 Version     : 1.0
 Copyright   : All rights reserved
 Description : FUSELAGE - FUSE FAT32 FILE SYSTEM
 ============================================================================
 */

#include "../../headers/GlobalHeader.h"

extern int32_t sizeCola;
extern PPD_CHS proximoSectorPlanifico;
extern int32_t sd;

int32_t proximoSectorAPlanificar()
{
	t_pedido structDelProcesoObtenido;
	int32_t nextSector;

	if(sizeCola == 0)
	{
		structDelProcesoObtenido.direccionSector = -1;
		return structDelProcesoObtenido.direccionSector;
	}
	else
	{
		nextSector = ppd_CHStoLBA(proximoSectorPlanifico);
		return nextSector;
	}
}

t_pedido armoPedidoAPlanificar(int32_t sector, char tipo)
{
	t_pedido structPlanifico;

	switch (tipo)
	{
		case 'L' :
			structPlanifico.conexion_pfs_id = PEDIDO_CONSOLA;
			structPlanifico.direccionSector = sector;
			structPlanifico.lectura_o_escritura = tipo;

			break;
		case 'E':
			structPlanifico.conexion_pfs_id = PEDIDO_CONSOLA;
			structPlanifico.direccionSector = sector;
			structPlanifico.lectura_o_escritura = tipo;
			strcpy(structPlanifico.info,charLimpio());

			break;
	}

	return structPlanifico;
}

void enviaRespuestaTRACE(PPD_CHS actual,PPD_CHS  anterior, int32_t sectorPlanificado)
{
	int32_t cantidadSectores, rc;
	int32_t *sectores;
	t_stream *streamEnvio;
	protocoloTRACE_respuesta *respuestaTRACE;

	cantidadSectores = diferenciaEntreSectores(anterior,actual);

	sectores = SectoresRecorro(anterior,actual);

	respuestaTRACE = (protocoloTRACE_respuesta*)malloc(sizeof(protocoloTRACE_respuesta));
	respuestaTRACE->cabecera.type = TRACE1;
	respuestaTRACE->payload.posicionActual = ppd_CHStoLBA(anterior);
	respuestaTRACE->payload.sectorSolicitado = sectorPlanificado;
	respuestaTRACE->payload.tiempoConsumido = tiempoEntreSectores(anterior,actual);
	respuestaTRACE->sectoresRecorridos = malloc(cantidadSectores*sizeof(int32_t));
	respuestaTRACE->payload.proximoSector = proximoSectorAPlanificar();
	memcpy(respuestaTRACE->sectoresRecorridos, sectores, cantidadSectores*sizeof(int32_t));
	respuestaTRACE->cabecera.payloadlength = sizeof(respuestaTRACE->payload) + cantidadSectores*sizeof(int32_t);

	streamEnvio = RespuestaTRACE_serializer(respuestaTRACE, cantidadSectores);

	rc = send(sd, streamEnvio->data, streamEnvio->length, 0);

	free(respuestaTRACE->sectoresRecorridos);
	free(respuestaTRACE);
	free(streamEnvio);

}

void enviaRespuestaCLEAN(int32_t valorClean)
{
	t_stream *streamEnvio;
	int32_t rc;
	protocoloCLEAN_respuesta *respuestaCLEAN;

	respuestaCLEAN = malloc(sizeof(protocoloCLEAN_respuesta));
	respuestaCLEAN->cabecera.type = CLEAN;
	respuestaCLEAN->cabecera.payloadlength = sizeof(int32_t);
	respuestaCLEAN->respuestaClean = valorClean;

	streamEnvio = RespuestaCLEAN_serializer(respuestaCLEAN);

	rc = send(sd, streamEnvio->data, streamEnvio->length, 0);
	if (rc < 0)
	{
		perror("send() failed");
	}

	free(respuestaCLEAN);
	free(streamEnvio);
}
